package main

import (
	"log"
)
import (
	"bytes"
	"time"

	"github.com/tarm/serial"
)

const COM_PORT = "COM1"

var JYD_SHUTDOWN []byte = []byte{0xA5, 0xB1, 0x00, 0x01, 0x4B, 0xA2}

const JYD_SERIAL_SHUTDOWN = "{0x40,0xF2,0x40,0xF0,0x40,0xF2}" //JYD串口关机指令
const BUFFER_SIZE = 128                                       //缓冲区的长度，即关机指令的长度
const SERIAL_BUFFER_SIZE = 128                                //串口接收缓冲区的长度

func serial_open() (s *serial.Port, err error) {
	var (
		serial_config serial.Config
		time_out      time.Duration
	)
	time_out = time.Duration(1) * time.Second //超时为2秒
	//2秒超时为2,定时超时时间后，serial_loop循环程序在超时过后就往下执行，不阻塞在s.Read()了
	//不能够一直阻塞，否则这个gorung就死了
	serial_config.ReadTimeout = time_out
	serial_config.Baud = 9600
	serial_config.Name = COM_PORT
	serial_config.Parity = serial.ParityNone
	serial_config.StopBits = serial.Stop1

	//c := &serial.Config{Name: "COM2", Baud: 9600}
	s, err = serial.OpenPort(&serial_config)
	if err != nil {
		//log.Fatal(err)
		log.Println("串口1打开失败！", err)
	}
	log.Println("打开串口", serial_config.Name, "成功！关机数据码：", JYD_SHUTDOWN, "\t 转成字符：", string(JYD_SHUTDOWN))
	log.Println("常量关机字符串：", JYD_SERIAL_SHUTDOWN, "\t 转换成字符串：", string(JYD_SERIAL_SHUTDOWN))
	return s, err
}

func serial_loop(s *serial.Port) {
	//串口循环处理程序
	var (
		r_buf []byte       //定义每次串口收到数据的缓冲
		buf   bytes.Buffer //定义缓冲区，将从串口收到的数据拼接到一起的缓冲区
		err   error
		n     int //串口每次读取到的字节数
	)
	r_buf = make([]byte, SERIAL_BUFFER_SIZE)
	//i:=0
	//for i := 0; i <= 10000; i++ {
	for {
		select {
		case <-ch_exit:
			log.Println("串口处理程序：收到了主程序的退出通知哦，我要走了，88！")
			return
		default:
			n, err = s.Read(r_buf) //n是收到的数据的长度
			if err != nil {
				continue
			}
			if n >= 1 {
				//打印的是16进制的原始数据
				log.Println("收到了", n, "个数据，打印出原始字节数据：", r_buf[:n], "\t 转换成字符串后为：", string(r_buf[:n]))

				buf.Write(r_buf[:n])
				if bytes.Contains(buf.Bytes(), JYD_SHUTDOWN) { //查找是否有关机的指令
					log.Println("--------------------收到关机指令！------------------")
					log.Println("打印出缓冲区的数据:", buf.Bytes()[:], "\t 转成字符串：", buf.String())
					buf.Reset()
					//接收到关机指令后，显示出用户满意度调查窗体
					go timer_handle_settitle(mw) //调用关机倒计时处理
					mw.Show()                    //显示窗体
				}
				if buf.Len() >= BUFFER_SIZE {
					log.Println("缓冲区已满，重置缓冲区！")
					buf.Reset()
				}
				//log.Println("收到了串口数据，准备写入缓冲区里！现在缓冲区的长度：",buf.Len())
				//log.Println("将",n,"个串口数据写入到缓冲区后，缓冲区的长度现在是：",buf.Len())
			}

		}
	}
	log.Println("串口处理器完成退出！")
	s.Close()
}
